function myInstanceOf(left, right) {
    let rightVal = right.prototype
    let leftVal = left.__proto__
    while(true) {
        if(leftVal === null) return false
        if(leftVal === rightVal) return true
        leftVal = leftVal.__proto__
    }
}
function SuperType() {
    this.property = true
    this.nums = [1, 2, 3]
}
SuperType.prototype.getSuperValue = function () {
    return this.property
}
function SubType() {
    this.subproperty = false
}
SubType.prototype = new SuperType()
// 后续通过字面量的方法修改原型，会导致之前的原型丢失
// SubType.prototype = {
//     b: 10
// }
SubType.prototype.getSubValue = function () {
    return this.subproperty
}
let instance1 = new SubType()
let instance2 = new SubType()
console.log(instance1.getSubValue());
console.log(instance1.getSuperValue());
// 对于instance.getSuperValue分为三个过程：1、找instance。2、找SubType.prototype。3、找SuperType.prototype一直到原型链的末端
// 原型继承的时候，如果需要覆盖方法，则必须在原型赋值之后，再添加到原型上。在原型添加之前会被覆盖掉

instance1.nums.push(4)
// 修改1导致2也被修改，所以原型上不建议共享属性。也就是为什么类都把属性写在构造函数中
console.log(instance2.nums);
console.log(myInstanceOf(instance1, SubType));